在之前的文章裡有提到ros的三大傳遞data的方式: topic, service和action。然而筆者通常只用到前兩項,action卻從來沒用到過,因此決定透過鐵人賽來練習一下這個action的實作。
action的原理跟service很像,不過service只會送一個request出去然後等待response回傳,action可以在執行該request時進行timeout、callback等計算,讓action在執行的過程中可以被中斷或是回傳任務狀態。
action的執行分為action server
和action client
,API統一包在ros actionlib
內,如圖:
action client和action server串接的方式是透過ros .action file
定義action的protocol,主要分為三個部分:Goal, Feedback和Result,以官網的洗碗機功能為例:
in action/DoDishes.action
:
# Define the goal
uint32 dishwasher_id
---
# Define the result
uint32 total_dishes_cleaned
---
# Define a feedback message
float32 percent_complete
跟.srv file
會用三個折線---
把request和response分開一樣,.action也是用一樣的方式區分Goal, Feedback和Result,三者的定義分別是:
上述的.action檔定義完以後,跟.srv一樣需要修改CMackList.txt和package.xml,編譯此.action檔以後就可以拿來用在程式碼內囉!
in CMakeLists.txt
:
find_package(catkin REQUIRED genmsg actionlib_msgs actionlib)
add_action_files(DIRECTORY action FILES DoDishes.action)
generate_messages(DEPENDENCIES actionlib_msgs)
in package.xml
:
<build_depend>actionlib</build_depend>
<build_depend>actionlib_msgs</build_depend>
<exec_depend>actionlib</exec_depend>
<exec_depend>actionlib_msgs</exec_depend>
編譯完成以後會生出一堆.msg檔:
這些msg就是用來讓action client
和action server
進行串接的protocol,至於action client
和action server
怎麼寫呢? 礙於時間與篇幅關係,就留待明天好好講解吧!
http://wiki.ros.org/actionlib
http://wiki.ros.org/actionlib/Tutorials
http://wiki.ros.org/actionlib/DetailedDescription
https://blog.csdn.net/weicao1990/article/details/80322110